/*
 * Renesas SCP/MCP Software
 * Copyright (c) 2020-2021, Renesas Electronics Corporation. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <asm_macros.S>

.global rcar_pwrc_switch_stack

/*
 * x0 : jump address,
 * x1 : stack address,
 * x2 : arg,
 * x3 : stack address (temporary)
 */
func rcar_pwrc_switch_stack

    /* lr to stack */
    stp x29, x30, [sp,#-16]

    /* change stack pointer */
    mov x3, sp
    mov sp, x1

    /* save stack pointer */
    sub sp, sp, #16
    stp x0, x3, [sp]

    /* data synchronization barrier */
    dsb sy

    /* jump to code */
    mov x1, x0
    mov x0, x2
    blr x1

    /* load stack pointer */
    ldp     x0, x2, [sp,#0]

    /* change stack pointer */
    mov sp, x2

    /* return */
    ldp x29, x30, [sp,#-16]
    ret
endfunc rcar_pwrc_switch_stack
